package cn.xaut.二叉树;

import cn.xaut.剑指offer.m20.TreeNode;

/**
 * 404. 左叶子之和
 */
public class demo404 {

    // 递归解法
    public int sumOfLeftLeaves(TreeNode root) {

        if (root == null)
            return 0;
        
        int res = 0;
        if (root.left != null) 
            res += isLeafNode(root.left) ? root.left.val : sumOfLeftLeaves(root.left);
        
        if (root.right != null)
            res += sumOfLeftLeaves(root.right);
        
        return res;
    }
    
    // 是否叶节点
    private boolean isLeafNode(TreeNode node) {
        return node.left == null && node.right == null;
    }

    // 递归解法——标准递归格式——未解决
    public int sumOfLeftLeaves2(TreeNode root) {
        
        // 递归终止条件
        if (root == null)
            return 0;
        if (root.left == null && root.right == null)
            return root.val;
        if (root.left == null && root.right != null)
            return sumOfLeftLeaves2(root.right);
        if (root.left != null && root.right == null)
            return isLeafNode(root.left) ? root.left.val : sumOfLeftLeaves2(root.left);
        
        // 递归过程
        return sumOfLeftLeaves2(root.left) + sumOfLeftLeaves2(root.right);        
    }

    // 自己写的
    public int sumOfLeftLeaves3(TreeNode root) {
        
        if (root == null)
            return 0;
        
        int res = 0;
        if (root.left != null)
            res += isLeafNode(root.left) ? root.left.val : sumOfLeftLeaves3(root.left);
        if (root.right != null)
            res += sumOfLeftLeaves3(root.right);
        
        return res;
    }
}
